今天要來補完剩下的一些註解標籤。
@Component.Builder
是一個標記型的接口注解,用於指示 Dagger 2
生成一個 Builder
類來建立相應的 Component
實例,也就是前面都是由Dagger2自己產生的Builder去建立,這邊我們用了@Component.Builder
標籤去建立一個自訂義的Builder接口。它通常與 Dagger 2 的 @Component
注解一起使用,以自定義 Component 建立過程。
在這當中允許我們自己新增一些自訂義的功能去延伸。
@BindsInstance
是 Dagger 2 中的一個方法注解,用於將特定的實例或值綁定到 Dagger 2 的 Component 中。這允許我們在 Component 建立過程中將自定義的實例或值提供給 Dagger 2,以便在依賴注入過程中使用。@BindsInstance
這個註解標籤是 Dagger 2 中可用於向 Component 傳遞特定的實例或值,以滿足不同的依賴注入需求。這是設計更具靈活性和可擴展性的應用程式架構的重要元素之一。
這邊我就直上程式碼就不再進行詳解了,只會放上與昨天對比有改動的部分。
public class State_School implements School{
// 公立&國立學校\
private static final String TAG = "State_School";
private int score;
@Inject
public State_School(int score) {
this.score = score;
}
@Override
public void buildSchoolType() {
Log.e(TAG, "buildSchoolType: "+TAG+"\nscore: "+score);
}
}
@Singleton
@Component(modules = {StudentModule.class,
TeacherModule.class,
StateSchoolModule.class})
public interface SchoolComponent {
// 以上內容無更改
// 添加以下的程式碼做自訂義Builder。
@Component.Builder
interface Builder{
@BindsInstance
Builder score(int score);
SchoolComponent build();
}
}
SchoolComponent schoolComponent;
的格式才能完成建立並取得在Component中創建的自訂義Builder。public class MainActivity extends AppCompatActivity {
@Inject
EducationSystem educationSystem01, educationSystem02;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 修改Builder。
SchoolComponent schoolComponent = DaggerSchoolComponent.builder()
.score(985)
.build();
schoolComponent.inject(this);
educationSystem01.start();
educationSystem02.start();
}
}
這個標籤簡單來說就是當有兩個相同的類要綁定就可能會需要@Named
標籤來做區分。
錯誤訊息我放到最後面再來說明,這邊先繼續開始修改。
@Named
註解標籤後就成功了。這邊與上面一樣我就只放有修改的部分。
public class State_School implements School{
private int score;
private String name;
private int worldRanking;
@Inject
public State_School(@Named("score")int score, String name, @Named("worldRanking") int worldRanking) {
this.score = score;
this.name = name;
this.worldRanking = worldRanking;
}
@Override
public void buildSchoolType() {
Log.e(TAG, "buildSchoolType: "+TAG+"\nscore: "+score+"\nname: "+name+"\nworldRanking: "+worldRanking);
}
}
@Singleton
@Component(modules = {StudentModule.class,
TeacherModule.class,
StateSchoolModule.class})
public interface SchoolComponent {
School getSchool();
void inject(MainActivity mainActivity);
@Component.Builder
interface Builder{
@BindsInstance
Builder score(@Named("score") int score);
@BindsInstance
Builder worldRanking(@Named("worldRanking") int worldRanking);
@BindsInstance
Builder name(String name);
SchoolComponent build();
}
}
public class MainActivity extends AppCompatActivity {
@Inject
EducationSystem educationSystem01, educationSystem02;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SchoolComponent schoolComponent = DaggerSchoolComponent.builder()
.score(700)
.name("清華大學")
.worldRanking(233)
.build();
schoolComponent.inject(this);
educationSystem01.start();
educationSystem02.start();
}
}
這個錯誤訊息是 Dagger 2 中的一個編譯錯誤,它表示在你的 Dagger 2 的Component:SchoolComponent
中存在重複的綁定(bindings)。
由上方的錯誤訊息指出了兩次綁定了 Integer 型態的物件:
這邊解決的方法有在旁邊加入@Named標籤註解
以供Dagger辨別。
以上是今天包含了@Component.Builder
、@BindsInstance
、@Named
的註解標籤添加說明與實作內容修改。